package org.xliu.cs.openproject.codegenerator.pojo;

/**
 * 表示Java类的字段
 */
public class JavaField {
    private final String name;
    private final String type;
    private final String cppType;
    private final String capitalizedName;
    private final boolean isList;
    private final String listElementType;

    // 构造函数和getter/setter方法
    public JavaField(String name, String type, String cppType, String capitalizedName) {
        this.name = name;
        this.type = type;
        this.cppType = cppType;
        this.capitalizedName = capitalizedName;
        this.isList = false;
        this.listElementType = null;
    }

    // 用于List类型或数组类型的构造函数
    public JavaField(String name, String type, String cppType, String capitalizedName, String listElementType) {
        this.name = name;
        this.type = type;
        this.cppType = cppType;
        this.capitalizedName = capitalizedName;
        this.isList = true; // 对于数组，我们也视为List处理
        this.listElementType = listElementType;
    }

    /**
     * 判断是否为自定义类型（非基本类型）
     * @param cppType C++类型
     * @return 是否为自定义类型
     */
    public static boolean isCustomType(String cppType) {
        // 如果C++类型不是基本类型且不以std::开头，则认为是自定义类型
        return cppType != null && !cppType.startsWith("std::") &&
                !cppType.equals("int") && !cppType.equals("long long") &&
                !cppType.equals("float") && !cppType.equals("double") &&
                !cppType.equals("bool");
    }

    // Getter方法
    public String getName() { return name; }
    public String getType() { return type; }
    public String getCppType() { return cppType; }
    public String getCapitalizedName() { return capitalizedName; }
    public boolean isList() { return isList; }
    public String getListElementType() { return listElementType; }
    public boolean getIsList() { return isList; }

    /**
     * 获取List或数组元素的C++类型
     * @return 元素的C++类型
     */
    public String getListElementCppType() {
        return BasicTypeMapping.getCppTypeForJavaType(listElementType);
    }
}